package com.edu.exam.entity.curriculum.questionbank;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 填空位置实体类
 * 所属模块：B-02 题库管理模块
 * 对应数据库表：fill_blank_position
 *
 * 根据B-02-03-05填空题管理子模块设计文档实现
 * 管理填空题中的具体填空位置信息，包括位置坐标、占位符、验证规则等。
 * 支持多种数据类型的填空位置配置和智能验证。
 *
 * @author System
 * @version 1.0.0
 */
@Entity
@Table(name = "fill_blank_position")
@Comment("填空位置信息表")
@EntityListeners(AuditingEntityListener.class)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FillBlankPosition {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 位置唯一标识符
     */
    @NotBlank(message = "位置ID不能为空")
    @Size(max = 50, message = "位置ID长度不能超过50个字符")
    @Column(name = "position_id", nullable = false, length = 50, unique = true)
    private String positionId;

    /**
     * 关联的填空题ID
     */
    @NotBlank(message = "题目ID不能为空")
    @Column(name = "question_id", nullable = false)
    private String questionId;

    /**
     * 在题目中的位置序号（从1开始）
     */
    @NotNull(message = "位置序号不能为空")
    @Column(name = "position_index", nullable = false)
    private Integer positionIndex;

    /**
     * 在题干中的开始字符位置
     */
    @NotNull(message = "开始位置不能为空")
    @Column(name = "start_index", nullable = false)
    private Integer startIndex;

    /**
     * 在题干中的结束字符位置
     */
    @NotNull(message = "结束位置不能为空")
    @Column(name = "end_index", nullable = false)
    private Integer endIndex;

    /**
     * 占位符文本（如：____、[____]、(____)等）
     */
    @Size(max = 20, message = "占位符文本长度不能超过20个字符")
    @Column(name = "placeholder_text", length = 20)
    private String placeholderText;

    /**
     * 填空位置类型（TEXT-文本，NUMBER-数字，DATE-日期，TIME-时间，EMAIL-邮箱，URL-链接，FORMULA-公式等）
     */
    @NotBlank(message = "位置类型不能为空")
    @Size(max = 20, message = "位置类型长度不能超过20个字符")
    @Column(name = "position_type", nullable = false, length = 20)
    private String positionType;

    /**
     * 数据类型约束（STRING-字符串，INTEGER-整数，DECIMAL-小数，DATE-日期，BOOLEAN-布尔值等）
     */
    @Size(max = 20, message = "数据类型长度不能超过20个字符")
    @Column(name = "data_type", length = 20)
    private String dataType;

    /**
     * 最大字符长度
     */
    @Column(name = "max_length")
    private Integer maxLength;

    /**
     * 最小字符长度
     */
    @Column(name = "min_length")
    private Integer minLength;

    /**
     * 是否必填
     */
    @NotNull(message = "必填设置不能为空")
    @Column(name = "is_required", nullable = false)
    private Boolean isRequired;

    /**
     * 默认值
     */
    @Size(max = 100, message = "默认值长度不能超过100个字符")
    @Column(name = "default_value", length = 100)
    private String defaultValue;

    /**
     * 填写提示文本
     */
    @Size(max = 200, message = "提示文本长度不能超过200个字符")
    @Column(name = "hint_text", length = 200)
    private String hintText;

    /**
     * 验证规则正则表达式
     */
    @Size(max = 200, message = "验证规则长度不能超过200个字符")
    @Column(name = "validation_rule", length = 200)
    private String validationRule;

    /**
     * 验证规则说明
     */
    @Size(max = 200, message = "验证说明长度不能超过200个字符")
    @Column(name = "validation_description", length = 200)
    private String validationDescription;

    /**
     * 错误提示信息
     */
    @Size(max = 200, message = "错误提示长度不能超过200个字符")
    @Column(name = "error_message", length = 200)
    private String errorMessage;

    /**
     * 输入格式要求（UPPERCASE-大写，LOWERCASE-小写，TITLECASE-标题格式，NONE-无要求）
     */
    @Size(max = 20, message = "输入格式长度不能超过20个字符")
    @Column(name = "input_format", length = 20)
    private String inputFormat;

    /**
     * 是否启用自动补全
     */
    @NotNull(message = "自动补全设置不能为空")
    @Column(name = "auto_complete_enabled", nullable = false)
    private Boolean autoCompleteEnabled;

    /**
     * 自动补全数据源（JSON格式，包含候选答案列表）
     */
    @Column(name = "auto_complete_source", columnDefinition = "TEXT")
    private String autoCompleteSource;

    /**
     * 是否启用输入提示
     */
    @NotNull(message = "输入提示设置不能为空")
    @Column(name = "input_hint_enabled", nullable = false)
    private Boolean inputHintEnabled;

    /**
     * 输入提示数据源（JSON格式）
     */
    @Column(name = "input_hint_source", columnDefinition = "TEXT")
    private String inputHintSource;

    /**
     * 位置样式配置（JSON格式）
     */
    @Column(name = "style_config", columnDefinition = "TEXT")
    private String styleConfig;

    /**
     * 扩展属性（JSON格式，存储额外的配置信息）
     */
    @Column(name = "extended_properties", columnDefinition = "TEXT")
    private String extendedProperties;

    /**
     * 排序权重（用于多空题目中的排序）
     */
    @Column(name = "sort_weight")
    private Integer sortWeight;

    /**
     * 是否显示在题干中（用于隐藏字段）
     */
    @NotNull(message = "显示设置不能为空")
    @Column(name = "is_visible", nullable = false)
    private Boolean isVisible;

    /**
     * 是否只读
     */
    @NotNull(message = "只读设置不能为空")
    @Column(name = "is_readonly", nullable = false)
    private Boolean isReadonly;

    /**
     * 是否禁用
     */
    @NotNull(message = "禁用设置不能为空")
    @Column(name = "is_disabled", nullable = false)
    private Boolean isDisabled;

    /**
     * 位置状态（ACTIVE-激活，INACTIVE-非激活，DEPRECATED-已废弃）
     */
    @NotBlank(message = "位置状态不能为空")
    @Size(max = 20, message = "位置状态长度不能超过20个字符")
    @Column(name = "position_status", nullable = false, length = 20)
    private String positionStatus;

    /**
     * 创建者ID
     */
    @Size(max = 50, message = "创建者ID长度不能超过50个字符")
    @Column(name = "created_by", nullable = false, length = 50)
    private String createdBy;

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新人ID
     */
    @Size(max = 50, message = "更新人ID长度不能超过50个字符")
    @Column(name = "updated_by", nullable = false, length = 50)
    private String updatedBy;

    /**
     * 更新时间
     */
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 软删除标识
     */
    @NotNull(message = "软删除标识不能为空")
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

}